h1b_df <- DATA

SECTION 1: BACKGROUND

SLIDE 7: MAP

htmltools::includeHTML("rMaps.html")

SECTION 2: STEM

SLIDE 9: Stem and non-stem histogram

DATA %>%
  group_by(year, stem) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n, fill = as.factor(stem))) +
  geom_bar(stat = "identity", position = position_stack(reverse = FALSE), alpha = 0.8) +
  scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  labs(y="\n Number", x="\n Year") + 
  scale_y_continuous(labels = function(x){paste0(x/1000, 'K')}) + 
  theme_minimal() + 
  theme(plot.title = element_text(hjust=0.5)) +
  theme(legend.position = "top")

SLIDE 10: STEM and non-STEM boxplot: “Prevailing wage boxplot throughout years”

DATA %>%
  filter(prevailing_wage >= 0 & prevailing_wage <= 600000) %>%
  ggplot(aes(x = as.factor(year), y = prevailing_wage)) +
  geom_boxplot(aes(fill=as.factor(stem)), outlier.shape = NA, alpha=0.9, color = "white") +
  theme_minimal() +
 labs(x = "\n Prevailing wage ($)", y = "Density \n") +
  scale_y_continuous(labels = function(x){paste0(x / 1000, "K")}) +
  scale_color_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  coord_cartesian(ylim = c(40000, 100000))

SLIDE 11: Stem and non-stem prevailing wage distribution in 2018

DATA %>%
  filter(year == 2018) %>%
  filter(prevailing_wage >= 0 & prevailing_wage <= 400000) %>% 
  ggplot(aes(x = prevailing_wage, color = as.factor(stem), fill = as.factor(stem))) +
  geom_density(adjust = 2, alpha = 0.7)+
  theme_classic() +
  labs(x = "\n Prevailing wage ($)", y = expression(Density~(10^{-3})), title = "Distribution of prevailing wage in 2018") +
  scale_x_continuous(labels = function(x){paste0(x/1000, 'K')}) +
  scale_y_continuous(labels = function(x){paste0(x * 1000, "")}) +
  scale_color_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
  theme(plot.title = element_text(hjust=0.5)) +
  theme_minimal()

SLIDE 12 AND 13: bar plot: stem jobs

dt <- DATA %>% 
  mutate(job_title = ifelse(str_detect(job_title, "business")& (str_detect(job_title, "analyst")|str_detect(job_title, "intelligence")) , "business analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& (str_detect(job_title, "engineer")|str_detect(job_title, "warehouse")), "data engineer", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "scientist"), "data scientist", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "analyst|analytics"), "data analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "machine|deep")& str_detect(job_title, "learning"), "deep learning & machine learning", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "product") & str_detect(job_title, "analyst|engineer|data"), "data product analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "senior systems analyst jc60"), "senior systems analyst", job_title)) %>% 
  filter(stem == 1)
# 
# dt %>% 
#   filter(year == 2017) %>% 
#   group_by(job_title) %>% 
#   summarise(n = n()) %>%
#   arrange(-n) %>% 
#   slice(1:20) %>% 
#   mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
#   arrange(n) %>% 
#   ggbarplot("job_title", "n", fill = "cat", palette = c("#FC2967", "#00B2E4"), alpha = 0.8, orientation = "horiz", color = "white") +
#   labs(y = "Number of Aplications", x = "Job Titles") +
#   theme_minimal()

dt %>% 
  filter(year == 2018) %>% 
  group_by(job_title) %>% 
  summarise(n = n()) %>%
  arrange(-n) %>% 
  slice(1:20) %>% 
  mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
  arrange(n) %>% 
  ggbarplot("job_title", "n", fill = "cat", palette = c("#FC2967", "#00B2E4"), alpha = 0.8, orientation = "horiz", color = "white") +
  labs(y = "Number of Aplications", x = "Job Titles")+
  theme_minimal()+
  theme(
    legend.position = "none"
  ) +
  theme(panel.grid.major.y = element_blank())



# original
dt %>% 
  filter(year == 2018) %>% 
  group_by(job_title) %>% 
  summarise(n = n()) %>%
  arrange(-n) %>% 
  slice(1:20) %>% 
  mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
  arrange(n) %>% 
  ggbarplot("job_title", "n", fill = "#00B2E4", alpha = 0.8, orientation = "horiz", color = "white") +
  labs(y = "Number of Aplications", x = "Job Titles") +
  theme_minimal()+
  theme(panel.grid.major.y = element_blank())

Slide 15

dt <- DATA %>% 
  filter(data_job_title %in% c("Business Analyst","Data Engineer","Data Analyst", "Data Scientist")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  arrange(-n) 

p1 <- dt %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2)+
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "Applications Data related jobs", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") + 
  theme_minimal() +
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))
p1

slide 16

filtered_job <- DATA %>% 
  filter(data_job_title %in% c("Business Analyst","Data Engineer", "Data Scientist","Data Analyst"))


filtered_job$data_job_title <- factor(filtered_job$data_job_title, levels = c("Data Analyst", "Business Analyst", "Data Engineer", "Data Scientist"), ordered = TRUE)


filtered_job %>% group_by(data_job_title) %>% summarise(mean = mean(prevailing_wage))
filtered_job %>%  
  ggplot(aes(y = prevailing_wage, x = data_job_title)) +
  geom_boxplot(fill = "#00B2E4", outlier.shape = NA, color = "white", width = 0.5) +
  coord_cartesian(ylim = c(50000, 120000)) +
  theme_minimal() +
  labs(x = "\n Job title", y = "Prevailing wage (per year) \n", title = "Prevailing wages in data related jobs") +
  theme(plot.title = element_text(size = 1),
        text = element_text(size = 12),
        axis.title = element_text(size = 16),
        axis.text.x= element_text(size = 10),
        axis.text.y = element_text(size = 10)) +
  theme(plot.title = element_text(hjust = 0.5))

Slide 17


top_com <- DATA %>% 
  filter(data_job_title %in% c("Business Analyst", "Data Analyst", "Data Engineer", "Data Scientist")) %>%
  group_by(employer_name) %>% 
  summarise(n = n()) %>% 
  arrange(-n) %>% 
  slice(1:20) %>% 
  ungroup()

top_com <-top_com$employer_name 

spa_data <- DATA %>% 
  filter(employer_name %in% top_com) %>% 
  filter(employer_name != "capgemini america inc") %>% 
  filter(data_job_title %in% c("Business Analyst", "Data Analyst", "Data Engineer", "Data Scientist")) %>%
  group_by(employer_name, year) %>% 
  summarise(n = n()) 

con=c("infosys limited", "deloitte consulting llp","amazon","facebook", "ibm")
myColor <- c("#465881", "#FFB6C1", "#00909e", "#00B2E4", "#FC2967")

# c(amazon, "deloitte", "#facebook", "ibm", "info")

ggplot(spa_data, aes(x = year, y = n, group = employer_name)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(x = "Year",
       y = "Number",
       col = "") +
  theme_classic()+
  geom_line(data = subset(spa_data, employer_name %in% con),aes(col=employer_name),size=1.2)+
  theme(plot.title = element_text(size = 14),
              text = element_text(size = 12),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11)) +
  scale_color_manual(values = myColor, breaks = c("infosys limited", "deloitte consulting llp","amazon","facebook", "ibm"), labels = c("Infosys Limited", "Deloitte Consulting","Amazon","Facebook", "IBM"))  +
  theme_minimal() +
  theme(legend.position = "right")

Slide 17

Data jobs in top companies


filtered_job_all <- DATA %>% 
  filter(data_job_title %in% c("Business Analyst","Data Analyst", "Data Engineer", "Data Scientist")) %>% 
  mutate(employer_name = ifelse(str_detect(employer_name,'apple'), 'Apple',
                          ifelse(str_detect(employer_name,'microsoft'), 'Microsoft',
                          ifelse(str_detect(employer_name,'amazon'),'Amazon',
                          ifelse(str_detect(employer_name,'facebook'),'Facebook',
                          ifelse(str_detect(employer_name,'google'),'Google',
                          ifelse(str_detect(employer_name, 'ibm'),'IBM',employer_name))))))) 
  

#IBM

top_com <- DATA %>% 
  filter(data_job_title %in% c("Business Analyst", "Data Analyst", "Data Engineer", "Data Scientist")) %>%
  group_by(employer_name) %>% 
  summarise(n = n()) %>% 
  arrange(-n) %>% 
  slice(1:20) %>% 
  ungroup()

top_com <-top_com$employer_name 

ibm_data <- DATA %>% 
  filter( str_detect(employer_name, "ibm")) %>% 
  group_by(job_title, year) %>% 
  summarise(n = n())%>% 
  mutate(data_job_title = 
           ifelse(str_detect(job_title,"business")&(str_detect(job_title,"analyst")|str_detect(job_title, "intelligence")), 
                  "Business Analyst", 
                  NA)) %>% 
  mutate(data_job_title = 
           ifelse(str_detect(job_title, "data")&(str_detect(job_title,"engineer")|str_detect(job_title, "warehouse")),
                  "Data Engineer", 
                  data_job_title)) %>% 
  mutate(data_job_title = 
           ifelse(str_detect(job_title, "data")&str_detect(job_title, "scientist"), 
                  "Data Scientist", 
                  data_job_title)) %>% 
  mutate(data_job_title = 
           ifelse(str_detect(job_title, "data")&str_detect(job_title, "analyst|analytics"), 
                  "Data Analyst", 
                  data_job_title)) %>% 
  mutate(data_job_title = 
           ifelse(str_detect(job_title, "machine|deep")&str_detect(job_title, "learning"), 
                  "Data Scientist", 
                  data_job_title)) %>% 
  mutate(data_job_title = 
           ifelse(str_detect(job_title, "product")&str_detect(job_title, "analyst|engineer|data"), 
                  "Data Analyst", 
                  data_job_title)) %>% 
  mutate(data_job_title = 
           ifelse(str_detect(job_title, "product")&str_detect(job_title, "manager"), 
                  "Product Manager", 
                  data_job_title))

con=c("infosys limited", "deloitte consulting llp","amazon","facebook", "ibm")
myColor <- c("#465881", "#FFB6C1", "#00909e", "#00B2E4", "#FC2967")

# c(amazon, "deloitte", "#facebook", "ibm", "info")

ggplot(ibm_data, aes(x = year, y = n, group = job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(x = "Year",
       y = "Number",
       col = "") +
  theme_classic()+
  geom_line(data = subset(ibm_data, data_job_title %in% c("Business Analyst", "Data Analyst", "Data Engineer", "Data Scientist")),aes(col=data_job_title),size=1.2)+
  theme(plot.title = element_text(size = 14),
              text = element_text(size = 12),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11),
        legend.position = "top",)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  ylim(0,150)

filtered_job_all %>% 
  filter(employer_name == 'IBM') %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

NA
NA

Infosys


filtered_job_all %>% 
  filter(str_detect(employer_name, 'infosys')) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        #axis.text = element_text(size = 15),
        #axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Accenture


filtered_job_all %>% 
  filter(str_detect(employer_name, 'accenture')) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Microsoft

filtered_job_all %>% 
  filter(employer_name == 'Microsoft') %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Amazon

filtered_job_all %>% 
  filter(employer_name == 'Amazon') %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Deloitte

filtered_job_all %>% 
  filter(str_detect(employer_name, "deloitte")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Facebook

filtered_job_all %>% 
  filter(str_detect(employer_name, "Facebook")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Apple

filtered_job_all %>% 
  filter(str_detect(employer_name, "Apple")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Google

filtered_job_all %>% 
  filter(str_detect(employer_name, "Google")) %>% 
  group_by(data_job_title, year) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = year, y = n))+
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title),size = 1.2)+
  labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
  scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme_minimal()+
  theme(legend.position = "top",
        axis.text = element_text(size = 15),
        axis.title.x = element_text(size = 15)
        ) +
  theme(plot.title = element_text(hjust=0.5))

Facebook

h1b_facebook <- h1b_df %>% 
  filter(employer_name == 'facebook') %>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
  
con=c("Data Scientist","software engineer","Data Engineer",'research scientist')
ggplot(h1b_facebook, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Facebook",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_facebook, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11))+
  scale_color_discrete(labels = c("Data Engineer", "Data Scientist", "Research Scientist","Software Engineer"))

Amazon


h1b_amazon <- h1b_df %>% 
  filter(str_detect(employer_name,'amazon')) %>% 
  ungroup(data_job_title) %>% 
  mutate(job_title=ifelse(str_detect(data_job_title,'software development engineer'), 'software development engineer', 
                   ifelse(str_detect(data_job_title,'technical program manager'), 'technical program manager',data_job_title)))%>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
con=c("Data Scientist","software development engineer","business analyst","Data Engineer","technical program manager")
ggplot(h1b_amazon, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Amazon",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_amazon, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11)) +
  scale_color_discrete(labels = c("Business Analyst", "Data Engineer", "Data Scientist","Software Development Engineer","Technical Program Manager"))

Microsoft

h1b_micro <- h1b_df %>% 
  filter(str_detect(employer_name,'microsoft')) %>% 
  ungroup(data_job_title) %>% 
  mutate(job_title=ifelse(str_detect(data_job_title,'software engineer|software development engineer'), 'software engineer', 
                   ifelse(str_detect(data_job_title,'program manager'), 'program manager',data_job_title))) %>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
  
con=c("Data Scientist","software engineer","program manager")
ggplot(h1b_micro, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Microsoft",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_micro, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11)) +
  scale_color_discrete(labels = c("Data Scientist","Program Manager","Software Engineer"))

Google

h1b_google <- h1b_df %>% 
  filter(str_detect(employer_name,'google')) 
  
h1b_google <- h1b_google %>% 
  ungroup(job_title) %>% 
  mutate(job_title=ifelse(str_detect(job_title,'software engineer'), 'software engineer',
              ifelse(str_detect(job_title,'hardware engineer'), 'hardware engineer',job_title))) %>% 
  group_by(job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
con=c("Data Scientist","software engineer","program manager","product manager","business analyst")
ggplot(h1b_google, aes(x = year, y = n, group = job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Google",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_google, job_title %in% con),aes(col=job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11)) +
  scale_color_discrete(labels = c("Business Analyst", "Data Scientist","Product Manager","Program Manager", "Software Engineer"))

IBM

h1b_ibm <- h1b_df %>% 
  filter(str_detect(employer_name,'ibm')) 
  
h1b_ibm <- h1b_ibm %>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
con=c("Business Analyst","Data Engineer","Data Scientist","Data Analyst")
ggplot(h1b_ibm, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_minimal()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_ibm, data_job_title %in% con),aes(col=data_job_title),size=1.1)+
    scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
  theme(plot.title = element_text(size = 14, family = "Helvetica"),
              text = element_text(size = 12, family = "Helvetica"),
              #axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11),
        legend.position = "none")+
  coord_cartesian(ylim=c(0,1000))

Uber

h1b_uber <- h1b_df %>% 
  filter(str_detect(employer_name,'uber')) %>% 
  ungroup(data_job_title) %>% 
  mutate(data_job_title=ifelse(str_detect(data_job_title,'software engineer'), 'Software Engineer', 
        data_job_title)) %>% 
  group_by(data_job_title,year) %>% 
  summarise(n=n()) %>% 
  arrange(-n)
con=c("Software Engineer","Data Scientist","Data Analyst")
ggplot(h1b_uber, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3, 
            size = 0.2) +
  labs(title = "H1B in Uber",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_light()+
  theme(plot.title = element_text(hjust = 0.5))+
   geom_line(data = subset(h1b_uber, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
  theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
              text = element_text(size = 12, family = "Helvetica"),
              axis.title = element_text(face="bold"),
              axis.text.x=element_text(size = 11))

Alluvia

filtered_job <- DATA %>% 
  filter(year == 2018) %>% 
  filter(data_job_title %in% c("Business Analyst","Data Analyst","Data Engineer", "Data Scientist"))


top_10_state <- filtered_job %>% 
  group_by(worksite_state_abb) %>% 
  summarise(count = n()) %>% 
  arrange(desc(count)) %>% 
  slice(1:10) 

flows <- filtered_job %>% 
  filter(worksite_state_abb %in% top_10_state$worksite_state_abb) %>% 
  group_by(data_job_title,
           worksite_state_abb) %>%
  summarise(count = n())


ggplot(flows, aes(y =count, axis1=data_job_title, axis2=worksite_state_abb)) +
  geom_alluvium(aes(fill = data_job_title)) +
  geom_stratum(width = 1/8, fill = "#0F2A48", color = "grey", alpha = 0.9) +
  geom_label(stat = "stratum", label.strata = TRUE) +
  labs(x="",y="")+
  theme_minimal()+
  theme(legend.position = "top") +
  scale_fill_manual(values =c("#FC2967","#465881", "#00909e", "#00B2E4"), name=NULL)+
  scale_x_discrete(limits = c("Job title", "State"), expand = c(.05, .05)) +
  theme(axis.text.x=element_text(size = 12, face = "bold"))+
  theme(line = element_blank())

bar plot:stem program in different job titles

DATA %>% 
  mutate(job_title = ifelse(str_detect(job_title, "business")& (str_detect(job_title, "analyst")|str_detect(job_title, "intelligence")) , "business analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& (str_detect(job_title, "engineer")|str_detect(job_title, "warehouse")), "data engineer", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "scientist"), "data scientist", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "analyst|analytics"), "data analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "machine|deep")& str_detect(job_title, "learning"), "deep learning & machine learning", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "product") & str_detect(job_title, "analyst|engineer|data"), "data product analyst", job_title)) %>% 
  filter(year == 2018) %>% 
  filter(stem == 1) %>% 
  group_by(job_title) %>% 
  summarise(n = n()) %>%
  arrange(-n) %>% 
  slice(1:20) %>% 
  ggbarplot("job_title", "n", fill = "#00B2E4", color = "white", alpha = 0.8, sort.val = "asc", orientation = "horiz") %>% 
  labs(title = "stem program")
[[1]]

$title
[1] "stem program"

attr(,"class")
[1] "labels"

MAP - data job with the highest number in each city

ggplot(points) + 
  geom_sf(data = state_maps, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon,100), y = jitter(lat,100), color = max_job, size = max), alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        legend.box = "horizontal",
        legend.position = c(0,-0.1), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "", size="Number")

ggplot(points_ca) + 
  geom_sf(data = state_maps_ca, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job, size = max), alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "", size="Number")

ggplot(points_tx) + 
  geom_sf(data = state_maps_tx, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job, size = max), alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "", size="Number")
ggplot(points_northeast) + 
  geom_sf(data = state_maps_northeast, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job, size = max), alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "", size="Number")

ggplot(points_midwest) + 
  geom_sf(data = state_maps_midwest, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon,100), y = jitter(lat,100), color = max_job, size = max), alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "", size="Number")

ggplot(points_tn) + 
  geom_sf(data = state_maps_tn, color = "white", fill = "lightgrey",alpha=0.5) +
  geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job,size = max), alpha = 0.5) + 
  scale_color_manual(values = c("Business Analyst" = "#00B2E4", 
                                "Data Analyst" = "#0F2A48",
                                "Data Engineer" = "#008B8B",
                                "Data Scientist" = "#FC2967"),
                     name = "Job Title") +
  theme(panel.background = element_blank(),
        legend.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        #legend.position = c(0,0), legend.justification = c(0,0)
        )+
  labs(x = "", y = "", title = "", size="Number")

LS0tCnRpdGxlOiAiRmluYWxfUmVwb3J0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CmgxYl9kZiA8LSBEQVRBCmBgYAoKCiMgU0VDVElPTiAxOiBCQUNLR1JPVU5ECiMgU0xJREUgNzogTUFQCgpgYGB7cn0KaHRtbHRvb2xzOjppbmNsdWRlSFRNTCgick1hcHMuaHRtbCIpCmBgYAoKIyBTRUNUSU9OIDI6IFNURU0KIyBTTElERSA5OiBTdGVtIGFuZCBub24tc3RlbSBoaXN0b2dyYW0KYGBge3IgZmlnLmhlaWdodD0yLjYsIGZpZy53aWR0aD0yLjN9CkRBVEEgJT4lCiAgZ3JvdXBfYnkoeWVhciwgc3RlbSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4sIGZpbGwgPSBhcy5mYWN0b3Ioc3RlbSkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2socmV2ZXJzZSA9IEZBTFNFKSwgYWxwaGEgPSAwLjgpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikpICsKICBsYWJzKHk9IlxuIE51bWJlciIsIHg9IlxuIFllYXIiKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmdW5jdGlvbih4KXtwYXN0ZTAoeC8xMDAwLCAnSycpfSkgKyAKICB0aGVtZV9taW5pbWFsKCkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBgCgoKIyBTTElERSAxMDogU1RFTSBhbmQgbm9uLVNURU0gYm94cGxvdDogIlByZXZhaWxpbmcgd2FnZSBib3hwbG90IHRocm91Z2hvdXQgeWVhcnMiCmBgYHtyfQpEQVRBICU+JQogIGZpbHRlcihwcmV2YWlsaW5nX3dhZ2UgPj0gMCAmIHByZXZhaWxpbmdfd2FnZSA8PSA2MDAwMDApICU+JQogIGdncGxvdChhZXMoeCA9IGFzLmZhY3Rvcih5ZWFyKSwgeSA9IHByZXZhaWxpbmdfd2FnZSkpICsKICBnZW9tX2JveHBsb3QoYWVzKGZpbGw9YXMuZmFjdG9yKHN0ZW0pKSwgb3V0bGllci5zaGFwZSA9IE5BLCBhbHBoYT0wLjksIGNvbG9yID0gIndoaXRlIikgKwogIHRoZW1lX21pbmltYWwoKSArCiBsYWJzKHggPSAiXG4gUHJldmFpbGluZyB3YWdlICgkKSIsIHkgPSAiRGVuc2l0eSBcbiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCl7cGFzdGUwKHggLyAxMDAwLCAiSyIpfSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoNDAwMDAsIDEwMDAwMCkpCmBgYAoKCiMgU0xJREUgMTE6IFN0ZW0gYW5kIG5vbi1zdGVtIHByZXZhaWxpbmcgd2FnZSBkaXN0cmlidXRpb24gaW4gMjAxOApgYGB7cn0KREFUQSAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDE4KSAlPiUKICBmaWx0ZXIocHJldmFpbGluZ193YWdlID49IDAgJiBwcmV2YWlsaW5nX3dhZ2UgPD0gNDAwMDAwKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcHJldmFpbGluZ193YWdlLCBjb2xvciA9IGFzLmZhY3RvcihzdGVtKSwgZmlsbCA9IGFzLmZhY3RvcihzdGVtKSkpICsKICBnZW9tX2RlbnNpdHkoYWRqdXN0ID0gMiwgYWxwaGEgPSAwLjcpKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4ID0gIlxuIFByZXZhaWxpbmcgd2FnZSAoJCkiLCB5ID0gZXhwcmVzc2lvbihEZW5zaXR5figxMF57LTN9KSksIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBwcmV2YWlsaW5nIHdhZ2UgaW4gMjAxOCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCl7cGFzdGUwKHgvMTAwMCwgJ0snKX0pICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCl7cGFzdGUwKHggKiAxMDAwLCAiIil9KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMwMEIyRTQiLCAiIzBGMkE0OCIpLCBuYW1lID0gIiIsIGxhYmVscyA9IGMoIm5vbi1TVEVNIiwgIlNURU0iKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiMwMEIyRTQiLCAiIzBGMkE0OCIpLCBuYW1lID0gIiIsIGxhYmVscyA9IGMoIm5vbi1TVEVNIiwgIlNURU0iKSkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgojIFNMSURFIDEyIEFORCAxMzogYmFyIHBsb3Q6IHN0ZW0gam9icwpgYGB7cn0KZHQgPC0gREFUQSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImJ1c2luZXNzIikmIChzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3QiKXxzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImludGVsbGlnZW5jZSIpKSAsICJidXNpbmVzcyBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmIChzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImVuZ2luZWVyIil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJ3YXJlaG91c2UiKSksICJkYXRhIGVuZ2luZWVyIiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAic2NpZW50aXN0IiksICJkYXRhIHNjaWVudGlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3R8YW5hbHl0aWNzIiksICJkYXRhIGFuYWx5c3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgIm1hY2hpbmV8ZGVlcCIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImxlYXJuaW5nIiksICJkZWVwIGxlYXJuaW5nICYgbWFjaGluZSBsZWFybmluZyIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAicHJvZHVjdCIpICYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGVuZ2luZWVyfGRhdGEiKSwgImRhdGEgcHJvZHVjdCBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJzZW5pb3Igc3lzdGVtcyBhbmFseXN0IGpjNjAiKSwgInNlbmlvciBzeXN0ZW1zIGFuYWx5c3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgZmlsdGVyKHN0ZW0gPT0gMSkKIyAKIyBkdCAlPiUgCiMgICBmaWx0ZXIoeWVhciA9PSAyMDE3KSAlPiUgCiMgICBncm91cF9ieShqb2JfdGl0bGUpICU+JSAKIyAgIHN1bW1hcmlzZShuID0gbigpKSAlPiUKIyAgIGFycmFuZ2UoLW4pICU+JSAKIyAgIHNsaWNlKDE6MjApICU+JSAKIyAgIG11dGF0ZShjYXQgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGRhdGEiKSwgImRhdGEiLCAibm9uLWRhdGEiKSkgJT4lCiMgICBhcnJhbmdlKG4pICU+JSAKIyAgIGdnYmFycGxvdCgiam9iX3RpdGxlIiwgIm4iLCBmaWxsID0gImNhdCIsIHBhbGV0dGUgPSBjKCIjRkMyOTY3IiwgIiMwMEIyRTQiKSwgYWxwaGEgPSAwLjgsIG9yaWVudGF0aW9uID0gImhvcml6IiwgY29sb3IgPSAid2hpdGUiKSArCiMgICBsYWJzKHkgPSAiTnVtYmVyIG9mIEFwbGljYXRpb25zIiwgeCA9ICJKb2IgVGl0bGVzIikgKwojICAgdGhlbWVfbWluaW1hbCgpCgpkdCAlPiUgCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lIAogIGdyb3VwX2J5KGpvYl90aXRsZSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKSAlPiUgCiAgc2xpY2UoMToyMCkgJT4lIAogIG11dGF0ZShjYXQgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGRhdGEiKSwgImRhdGEiLCAibm9uLWRhdGEiKSkgJT4lCiAgYXJyYW5nZShuKSAlPiUgCiAgZ2diYXJwbG90KCJqb2JfdGl0bGUiLCAibiIsIGZpbGwgPSAiY2F0IiwgcGFsZXR0ZSA9IGMoIiNGQzI5NjciLCAiIzAwQjJFNCIpLCBhbHBoYSA9IDAuOCwgb3JpZW50YXRpb24gPSAiaG9yaXoiLCBjb2xvciA9ICJ3aGl0ZSIpICsKICBsYWJzKHkgPSAiTnVtYmVyIG9mIEFwbGljYXRpb25zIiwgeCA9ICJKb2IgVGl0bGVzIikrCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiCiAgKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQoKCiMgb3JpZ2luYWwKZHQgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSAKICBncm91cF9ieShqb2JfdGl0bGUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgYXJyYW5nZSgtbikgJT4lIAogIHNsaWNlKDE6MjApICU+JSAKICBtdXRhdGUoY2F0ID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxkYXRhIiksICJkYXRhIiwgIm5vbi1kYXRhIikpICU+JQogIGFycmFuZ2UobikgJT4lIAogIGdnYmFycGxvdCgiam9iX3RpdGxlIiwgIm4iLCBmaWxsID0gIiMwMEIyRTQiLCBhbHBoYSA9IDAuOCwgb3JpZW50YXRpb24gPSAiaG9yaXoiLCBjb2xvciA9ICJ3aGl0ZSIpICsKICBsYWJzKHkgPSAiTnVtYmVyIG9mIEFwbGljYXRpb25zIiwgeCA9ICJKb2IgVGl0bGVzIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyBTbGlkZSAxNQpgYGB7cixmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00fQpkdCA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsIkRhdGEgQW5hbHlzdCIsICJEYXRhIFNjaWVudGlzdCIpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGFycmFuZ2UoLW4pIAoKcDEgPC0gZHQgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikrCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSxzaXplID0gMS4yKSsKICBsYWJzKCB5ID0gIiIsIHggPSAiWWVhciIsIHRpdGxlID0gIkFwcGxpY2F0aW9ucyBEYXRhIHJlbGF0ZWQgam9icyIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZSA9ICIiKSArIAogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCnAxCmBgYAoKIyBzbGlkZSAxNgoKYGBge3J9CmZpbHRlcmVkX2pvYiA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIsIkRhdGEgQW5hbHlzdCIpKQoKCmZpbHRlcmVkX2pvYiRkYXRhX2pvYl90aXRsZSA8LSBmYWN0b3IoZmlsdGVyZWRfam9iJGRhdGFfam9iX3RpdGxlLCBsZXZlbHMgPSBjKCJEYXRhIEFuYWx5c3QiLCAiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IiksIG9yZGVyZWQgPSBUUlVFKQoKCmZpbHRlcmVkX2pvYiAlPiUgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4ocHJldmFpbGluZ193YWdlKSkKZmlsdGVyZWRfam9iICU+JSAgCiAgZ2dwbG90KGFlcyh5ID0gcHJldmFpbGluZ193YWdlLCB4ID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiIzAwQjJFNCIsIG91dGxpZXIuc2hhcGUgPSBOQSwgY29sb3IgPSAid2hpdGUiLCB3aWR0aCA9IDAuNSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyg1MDAwMCwgMTIwMDAwKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh4ID0gIlxuIEpvYiB0aXRsZSIsIHkgPSAiUHJldmFpbGluZyB3YWdlIChwZXIgeWVhcikgXG4iLCB0aXRsZSA9ICJQcmV2YWlsaW5nIHdhZ2VzIGluIGRhdGEgcmVsYXRlZCBqb2JzIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEpLAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgYXhpcy50ZXh0Lng9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKIyBTbGlkZSAxNwpgYGB7cn0KCnRvcF9jb20gPC0gREFUQSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEFuYWx5c3QiLCAiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKSAlPiUKICBncm91cF9ieShlbXBsb3llcl9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBhcnJhbmdlKC1uKSAlPiUgCiAgc2xpY2UoMToyMCkgJT4lIAogIHVuZ3JvdXAoKQoKdG9wX2NvbSA8LXRvcF9jb20kZW1wbG95ZXJfbmFtZSAKCnNwYV9kYXRhIDwtIERBVEEgJT4lIAogIGZpbHRlcihlbXBsb3llcl9uYW1lICVpbiUgdG9wX2NvbSkgJT4lIAogIGZpbHRlcihlbXBsb3llcl9uYW1lICE9ICJjYXBnZW1pbmkgYW1lcmljYSBpbmMiKSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEFuYWx5c3QiLCAiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKSAlPiUKICBncm91cF9ieShlbXBsb3llcl9uYW1lLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpIAoKY29uPWMoImluZm9zeXMgbGltaXRlZCIsICJkZWxvaXR0ZSBjb25zdWx0aW5nIGxscCIsImFtYXpvbiIsImZhY2Vib29rIiwgImlibSIpCm15Q29sb3IgPC0gYygiIzQ2NTg4MSIsICIjRkZCNkMxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIsICIjRkMyOTY3IikKCiMgYyhhbWF6b24sICJkZWxvaXR0ZSIsICIjZmFjZWJvb2siLCAiaWJtIiwgImluZm8iKQoKZ2dwbG90KHNwYV9kYXRhLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGVtcGxveWVyX25hbWUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnMoeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICIiKSArCiAgdGhlbWVfY2xhc3NpYygpKwogIGdlb21fbGluZShkYXRhID0gc3Vic2V0KHNwYV9kYXRhLCBlbXBsb3llcl9uYW1lICVpbiUgY29uKSxhZXMoY29sPWVtcGxveWVyX25hbWUpLHNpemU9MS4yKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15Q29sb3IsIGJyZWFrcyA9IGMoImluZm9zeXMgbGltaXRlZCIsICJkZWxvaXR0ZSBjb25zdWx0aW5nIGxscCIsImFtYXpvbiIsImZhY2Vib29rIiwgImlibSIpLCBsYWJlbHMgPSBjKCJJbmZvc3lzIExpbWl0ZWQiLCAiRGVsb2l0dGUgQ29uc3VsdGluZyIsIkFtYXpvbiIsIkZhY2Vib29rIiwgIklCTSIpKSAgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmBgYAoKCiMgU2xpZGUgMTcKIyBUb3AgVGVjaCBDb21wYW5pZXMgYW5kIFRoZWlyIFRyZW5kcwpgYGB7cn0Kc29jX3RvcF90ZWNoIDwtIGMoIkFwcGxlIiwKICAgICAgICAgICAgICAgICAgIk1pY3Jvc29mdCIsCiAgICAgICAgICAgICAgICAgICJBbWF6b24iLAogICAgICAgICAgICAgICAgICAiRmFjZWJvb2siLAogICAgICAgICAgICAgICAgICAiR29vZ2xlIiwKICAgICAgICAgICAgICAgICAgIklCTSIpCgoKREFUQSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsIkRhdGEgRW5naW5lZXIiLCJEYXRhIEFuYWx5c3QiLCAiRGF0YSBTY2llbnRpc3QiKSkgJT4lIAogIG11dGF0ZShlbXBsb3llcl9uYW1lID0gaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYXBwbGUnKSwgJ0FwcGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdtaWNyb3NvZnQnKSwgJ01pY3Jvc29mdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYW1hem9uJyksJ0FtYXpvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnZmFjZWJvb2snKSwnRmFjZWJvb2snLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2dvb2dsZScpLCdHb29nbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdpYm0nKSwnSUJNJywnbm8nKSkpKSkpKSAlPiUgCiAgZ3JvdXBfYnkoZW1wbG95ZXJfbmFtZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZSh0b3QgPSBuKCkpICU+JSAKICBmaWx0ZXIoIWVtcGxveWVyX25hbWUgJWluJSBjKCJubyIsIE5BKSkgJT4lIAogIHVuZ3JvdXAoKSU+JSAKICBnZ3Bsb3QoKSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJSZEJ1IikgKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSB0b3QsIGNvbG9yID0gZW1wbG95ZXJfbmFtZSksIHNpemUgPSAxLjUpKwogIGxhYnMoIHkgPSAiTnVtYmVyIG9mIEFwcGxpY2F0aW9ucyIsIHggPSAiWWVhciIsIGNvbG9yID0gIkVtcGxveWVyIikrCiAgdGhlbWVfbWluaW1hbCgpCgpgYGAKCgojIERhdGEgam9icyBpbiB0b3AgY29tcGFuaWVzIApgYGB7cn0KCmZpbHRlcmVkX2pvYl9hbGwgPC0gREFUQSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsIkRhdGEgQW5hbHlzdCIsICJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IikpICU+JSAKICBtdXRhdGUoZW1wbG95ZXJfbmFtZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2FwcGxlJyksICdBcHBsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnbWljcm9zb2Z0JyksICdNaWNyb3NvZnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2FtYXpvbicpLCdBbWF6b24nLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2ZhY2Vib29rJyksJ0ZhY2Vib29rJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdnb29nbGUnKSwnR29vZ2xlJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnaWJtJyksJ0lCTScsZW1wbG95ZXJfbmFtZSkpKSkpKSkgCiAgCmBgYAoKI0lCTQoKCgpgYGB7cn0KdG9wX2NvbSA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwgIkRhdGEgQW5hbHlzdCIsICJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IikpICU+JQogIGdyb3VwX2J5KGVtcGxveWVyX25hbWUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGFycmFuZ2UoLW4pICU+JSAKICBzbGljZSgxOjIwKSAlPiUgCiAgdW5ncm91cCgpCgp0b3BfY29tIDwtdG9wX2NvbSRlbXBsb3llcl9uYW1lIAoKaWJtX2RhdGEgPC0gREFUQSAlPiUgCiAgZmlsdGVyKCBzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICJpYm0iKSkgJT4lIAogIGdyb3VwX2J5KGpvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGUgPSAKICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsImJ1c2luZXNzIikmKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCJhbmFseXN0Iil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJpbnRlbGxpZ2VuY2UiKSksIAogICAgICAgICAgICAgICAgICAiQnVzaW5lc3MgQW5hbHlzdCIsIAogICAgICAgICAgICAgICAgICBOQSkpICU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGUgPSAKICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCJlbmdpbmVlciIpfHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAid2FyZWhvdXNlIikpLAogICAgICAgICAgICAgICAgICAiRGF0YSBFbmdpbmVlciIsIAogICAgICAgICAgICAgICAgICBkYXRhX2pvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGUgPSAKICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmc3RyX2RldGVjdChqb2JfdGl0bGUsICJzY2llbnRpc3QiKSwgCiAgICAgICAgICAgICAgICAgICJEYXRhIFNjaWVudGlzdCIsIAogICAgICAgICAgICAgICAgICBkYXRhX2pvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGUgPSAKICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGFuYWx5dGljcyIpLCAKICAgICAgICAgICAgICAgICAgIkRhdGEgQW5hbHlzdCIsIAogICAgICAgICAgICAgICAgICBkYXRhX2pvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGUgPSAKICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJtYWNoaW5lfGRlZXAiKSZzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImxlYXJuaW5nIiksIAogICAgICAgICAgICAgICAgICAiRGF0YSBTY2llbnRpc3QiLCAKICAgICAgICAgICAgICAgICAgZGF0YV9qb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGRhdGFfam9iX3RpdGxlID0gCiAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAicHJvZHVjdCIpJnN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxlbmdpbmVlcnxkYXRhIiksIAogICAgICAgICAgICAgICAgICAiRGF0YSBBbmFseXN0IiwgCiAgICAgICAgICAgICAgICAgIGRhdGFfam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShkYXRhX2pvYl90aXRsZSA9IAogICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInByb2R1Y3QiKSZzdHJfZGV0ZWN0KGpvYl90aXRsZSwgIm1hbmFnZXIiKSwgCiAgICAgICAgICAgICAgICAgICJQcm9kdWN0IE1hbmFnZXIiLCAKICAgICAgICAgICAgICAgICAgZGF0YV9qb2JfdGl0bGUpKQoKY29uPWMoImluZm9zeXMgbGltaXRlZCIsICJkZWxvaXR0ZSBjb25zdWx0aW5nIGxscCIsImFtYXpvbiIsImZhY2Vib29rIiwgImlibSIpCm15Q29sb3IgPC0gYygiIzQ2NTg4MSIsICIjRkZCNkMxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIsICIjRkMyOTY3IikKCiMgYyhhbWF6b24sICJkZWxvaXR0ZSIsICIjZmFjZWJvb2siLCAiaWJtIiwgImluZm8iKQoKZ2dwbG90KGlibV9kYXRhLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGpvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gIiIpICsKICB0aGVtZV9jbGFzc2ljKCkrCiAgZ2VvbV9saW5lKGRhdGEgPSBzdWJzZXQoaWJtX2RhdGEsIGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEFuYWx5c3QiLCAiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKSxhZXMoY29sPWRhdGFfam9iX3RpdGxlKSxzaXplPTEuMikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZSA9IDExKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHlsaW0oMCwxNTApCmBgYAoKCgoKCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnSUJNJykgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCgoKYGBgCgojIEluZm9zeXMKYGBge3J9CgpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnaW5mb3N5cycpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICAjYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgI2F4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgICAgICAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQoKYGBgCgojIEFjY2VudHVyZQpgYGB7cn0KCmZpbHRlcmVkX2pvYl9hbGwgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdhY2NlbnR1cmUnKSkgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCgpgYGAKCiMgTWljcm9zb2Z0CmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnTWljcm9zb2Z0JykgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKIyBBbWF6b24KYGBge3J9CmZpbHRlcmVkX2pvYl9hbGwgJT4lIAogIGZpbHRlcihlbXBsb3llcl9uYW1lID09ICdBbWF6b24nKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICAgICAgICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKYGBgCgojIERlbG9pdHRlCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAiZGVsb2l0dGUiKSkgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKIyBGYWNlYm9vawpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgIkZhY2Vib29rIikpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSxzaXplID0gMS4yKSsKICBsYWJzKCB5ID0gIiIsIHggPSAiWWVhciIsIHRpdGxlID0gIiIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgICAgICAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpgYGAKCiMgQXBwbGUKYGBge3J9CmZpbHRlcmVkX2pvYl9hbGwgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICJBcHBsZSIpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICAgICAgICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKYGBgCgojIEdvb2dsZQpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgIkdvb2dsZSIpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICAgICAgICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKYGBgCgojIyBGYWNlYm9vawoKYGBge3J9CmgxYl9mYWNlYm9vayA8LSBoMWJfZGYgJT4lIAogIGZpbHRlcihlbXBsb3llcl9uYW1lID09ICdmYWNlYm9vaycpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSx5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG49bigpKSAlPiUgCiAgYXJyYW5nZSgtbikKICAKYGBgCgoKCmBgYHtyfQpjb249YygiRGF0YSBTY2llbnRpc3QiLCJzb2Z0d2FyZSBlbmdpbmVlciIsIkRhdGEgRW5naW5lZXIiLCdyZXNlYXJjaCBzY2llbnRpc3QnKQpnZ3Bsb3QoaDFiX2ZhY2Vib29rLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGRhdGFfam9iX3RpdGxlKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuMywgCiAgICAgICAgICAgIHNpemUgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIkgxQiBpbiBGYWNlYm9vayIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gJ0pvYiBUaXRsZScpICsKICB0aGVtZV9saWdodCgpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICAgZ2VvbV9saW5lKGRhdGEgPSBzdWJzZXQoaDFiX2ZhY2Vib29rLCBkYXRhX2pvYl90aXRsZSAlaW4lIGNvbiksYWVzKGNvbD1kYXRhX2pvYl90aXRsZSksc2l6ZT0wLjcpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiSGVsdmV0aWNhIiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhbWlseSA9ICJIZWx2ZXRpY2EiKSwKICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZSA9IDExKSkrCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobGFiZWxzID0gYygiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIsICJSZXNlYXJjaCBTY2llbnRpc3QiLCJTb2Z0d2FyZSBFbmdpbmVlciIpKQoKYGBgCgojIyBBbWF6b24KCmBgYHtyfQoKaDFiX2FtYXpvbiA8LSBoMWJfZGYgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2FtYXpvbicpKSAlPiUgCiAgdW5ncm91cChkYXRhX2pvYl90aXRsZSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGU9aWZlbHNlKHN0cl9kZXRlY3QoZGF0YV9qb2JfdGl0bGUsJ3NvZnR3YXJlIGRldmVsb3BtZW50IGVuZ2luZWVyJyksICdzb2Z0d2FyZSBkZXZlbG9wbWVudCBlbmdpbmVlcicsIAogICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZGF0YV9qb2JfdGl0bGUsJ3RlY2huaWNhbCBwcm9ncmFtIG1hbmFnZXInKSwgJ3RlY2huaWNhbCBwcm9ncmFtIG1hbmFnZXInLGRhdGFfam9iX3RpdGxlKSkpJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLHllYXIpICU+JSAKICBzdW1tYXJpc2Uobj1uKCkpICU+JSAKICBhcnJhbmdlKC1uKQoKYGBgCgpgYGB7cn0KY29uPWMoIkRhdGEgU2NpZW50aXN0Iiwic29mdHdhcmUgZGV2ZWxvcG1lbnQgZW5naW5lZXIiLCJidXNpbmVzcyBhbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsInRlY2huaWNhbCBwcm9ncmFtIG1hbmFnZXIiKQpnZ3Bsb3QoaDFiX2FtYXpvbiwgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJIMUIgaW4gQW1hem9uIiwKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIk51bWJlciIsCiAgICAgICBjb2wgPSAnSm9iIFRpdGxlJykgKwogIHRoZW1lX2xpZ2h0KCkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChoMWJfYW1hem9uLCBkYXRhX2pvYl90aXRsZSAlaW4lIGNvbiksYWVzKGNvbD1kYXRhX2pvYl90aXRsZSksc2l6ZT0wLjcpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiSGVsdmV0aWNhIiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhbWlseSA9ICJIZWx2ZXRpY2EiKSwKICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZSA9IDExKSkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGxhYmVscyA9IGMoIkJ1c2luZXNzIEFuYWx5c3QiLCAiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIsIlNvZnR3YXJlIERldmVsb3BtZW50IEVuZ2luZWVyIiwiVGVjaG5pY2FsIFByb2dyYW0gTWFuYWdlciIpKQpgYGAKCgojIyBNaWNyb3NvZnQKCmBgYHtyfQpoMWJfbWljcm8gPC0gaDFiX2RmICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdtaWNyb3NvZnQnKSkgJT4lIAogIHVuZ3JvdXAoZGF0YV9qb2JfdGl0bGUpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlPWlmZWxzZShzdHJfZGV0ZWN0KGRhdGFfam9iX3RpdGxlLCdzb2Z0d2FyZSBlbmdpbmVlcnxzb2Z0d2FyZSBkZXZlbG9wbWVudCBlbmdpbmVlcicpLCAnc29mdHdhcmUgZW5naW5lZXInLCAKICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGRhdGFfam9iX3RpdGxlLCdwcm9ncmFtIG1hbmFnZXInKSwgJ3Byb2dyYW0gbWFuYWdlcicsZGF0YV9qb2JfdGl0bGUpKSkgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLHllYXIpICU+JSAKICBzdW1tYXJpc2Uobj1uKCkpICU+JSAKICBhcnJhbmdlKC1uKQogIApgYGAKCmBgYHtyfQpjb249YygiRGF0YSBTY2llbnRpc3QiLCJzb2Z0d2FyZSBlbmdpbmVlciIsInByb2dyYW0gbWFuYWdlciIpCmdncGxvdChoMWJfbWljcm8sIGFlcyh4ID0geWVhciwgeSA9IG4sIGdyb3VwID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnModGl0bGUgPSAiSDFCIGluIE1pY3Jvc29mdCIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gJ0pvYiBUaXRsZScpICsKICB0aGVtZV9saWdodCgpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICAgZ2VvbV9saW5lKGRhdGEgPSBzdWJzZXQoaDFiX21pY3JvLCBkYXRhX2pvYl90aXRsZSAlaW4lIGNvbiksYWVzKGNvbD1kYXRhX2pvYl90aXRsZSksc2l6ZT0wLjcpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiSGVsdmV0aWNhIiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhbWlseSA9ICJIZWx2ZXRpY2EiKSwKICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZSA9IDExKSkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGxhYmVscyA9IGMoIkRhdGEgU2NpZW50aXN0IiwiUHJvZ3JhbSBNYW5hZ2VyIiwiU29mdHdhcmUgRW5naW5lZXIiKSkKYGBgCgoKIyMgR29vZ2xlCgpgYGB7cn0KaDFiX2dvb2dsZSA8LSBoMWJfZGYgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2dvb2dsZScpKSAKICAKYGBgCgpgYGB7cn0KaDFiX2dvb2dsZSA8LSBoMWJfZ29vZ2xlICU+JSAKICB1bmdyb3VwKGpvYl90aXRsZSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGU9aWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCdzb2Z0d2FyZSBlbmdpbmVlcicpLCAnc29mdHdhcmUgZW5naW5lZXInLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwnaGFyZHdhcmUgZW5naW5lZXInKSwgJ2hhcmR3YXJlIGVuZ2luZWVyJyxqb2JfdGl0bGUpKSkgJT4lIAogIGdyb3VwX2J5KGpvYl90aXRsZSx5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG49bigpKSAlPiUgCiAgYXJyYW5nZSgtbikKYGBgCgpgYGB7cn0KY29uPWMoIkRhdGEgU2NpZW50aXN0Iiwic29mdHdhcmUgZW5naW5lZXIiLCJwcm9ncmFtIG1hbmFnZXIiLCJwcm9kdWN0IG1hbmFnZXIiLCJidXNpbmVzcyBhbmFseXN0IikKZ2dwbG90KGgxYl9nb29nbGUsIGFlcyh4ID0geWVhciwgeSA9IG4sIGdyb3VwID0gam9iX3RpdGxlKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuMywgCiAgICAgICAgICAgIHNpemUgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIkgxQiBpbiBHb29nbGUiLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICdKb2IgVGl0bGUnKSArCiAgdGhlbWVfbGlnaHQoKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgIGdlb21fbGluZShkYXRhID0gc3Vic2V0KGgxYl9nb29nbGUsIGpvYl90aXRsZSAlaW4lIGNvbiksYWVzKGNvbD1qb2JfdGl0bGUpLHNpemU9MC43KSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gIkhlbHZldGljYSIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShsYWJlbHMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiwgIkRhdGEgU2NpZW50aXN0IiwiUHJvZHVjdCBNYW5hZ2VyIiwiUHJvZ3JhbSBNYW5hZ2VyIiwgIlNvZnR3YXJlIEVuZ2luZWVyIikpCmBgYAoKCiMjIElCTSAKCmBgYHtyfQpoMWJfaWJtIDwtIGgxYl9kZiAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnaWJtJykpIAogIApgYGAKCmBgYHtyfQpoMWJfaWJtIDwtIGgxYl9pYm0gJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLHllYXIpICU+JSAKICBzdW1tYXJpc2Uobj1uKCkpICU+JSAKICBhcnJhbmdlKC1uKQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTIuNX0KY29uPWMoIkJ1c2luZXNzIEFuYWx5c3QiLCJEYXRhIEVuZ2luZWVyIiwiRGF0YSBTY2llbnRpc3QiLCJEYXRhIEFuYWx5c3QiKQpnZ3Bsb3QoaDFiX2libSwgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICIiLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICdKb2IgVGl0bGUnKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICAgZ2VvbV9saW5lKGRhdGEgPSBzdWJzZXQoaDFiX2libSwgZGF0YV9qb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9ZGF0YV9qb2JfdGl0bGUpLHNpemU9MS4xKSsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhbWlseSA9ICJIZWx2ZXRpY2EiKSwKICAgICAgICAgICAgICAjYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMTAwMCkpCmBgYAoKIyMgVWJlcgoKYGBge3J9CmgxYl91YmVyIDwtIGgxYl9kZiAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwndWJlcicpKSAlPiUgCiAgdW5ncm91cChkYXRhX2pvYl90aXRsZSkgJT4lIAogIG11dGF0ZShkYXRhX2pvYl90aXRsZT1pZmVsc2Uoc3RyX2RldGVjdChkYXRhX2pvYl90aXRsZSwnc29mdHdhcmUgZW5naW5lZXInKSwgJ1NvZnR3YXJlIEVuZ2luZWVyJywgCiAgICAgICAgZGF0YV9qb2JfdGl0bGUpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUseWVhcikgJT4lIAogIHN1bW1hcmlzZShuPW4oKSkgJT4lIAogIGFycmFuZ2UoLW4pCmBgYAoKYGBge3J9CmNvbj1jKCJTb2Z0d2FyZSBFbmdpbmVlciIsIkRhdGEgU2NpZW50aXN0IiwiRGF0YSBBbmFseXN0IikKZ2dwbG90KGgxYl91YmVyLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGRhdGFfam9iX3RpdGxlKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuMywgCiAgICAgICAgICAgIHNpemUgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIkgxQiBpbiBVYmVyIiwKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIk51bWJlciIsCiAgICAgICBjb2wgPSAnSm9iIFRpdGxlJykgKwogIHRoZW1lX2xpZ2h0KCkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChoMWJfdWJlciwgZGF0YV9qb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9ZGF0YV9qb2JfdGl0bGUpLHNpemU9MC43KSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gIkhlbHZldGljYSIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpCmBgYAoKCiMjIEFsbHV2aWEKYGBge3IsZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9Mi43fQpmaWx0ZXJlZF9qb2IgPC0gREFUQSAlPiUgCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lIAogIGZpbHRlcihkYXRhX2pvYl90aXRsZSAlaW4lIGMoIkJ1c2luZXNzIEFuYWx5c3QiLCJEYXRhIEFuYWx5c3QiLCJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IikpCgoKdG9wXzEwX3N0YXRlIDwtIGZpbHRlcmVkX2pvYiAlPiUgCiAgZ3JvdXBfYnkod29ya3NpdGVfc3RhdGVfYWJiKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNvdW50KSkgJT4lIAogIHNsaWNlKDE6MTApIAoKZmxvd3MgPC0gZmlsdGVyZWRfam9iICU+JSAKICBmaWx0ZXIod29ya3NpdGVfc3RhdGVfYWJiICVpbiUgdG9wXzEwX3N0YXRlJHdvcmtzaXRlX3N0YXRlX2FiYikgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLAogICAgICAgICAgIHdvcmtzaXRlX3N0YXRlX2FiYikgJT4lCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKQoKCmdncGxvdChmbG93cywgYWVzKHkgPWNvdW50LCBheGlzMT1kYXRhX2pvYl90aXRsZSwgYXhpczI9d29ya3NpdGVfc3RhdGVfYWJiKSkgKwogIGdlb21fYWxsdXZpdW0oYWVzKGZpbGwgPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX3N0cmF0dW0od2lkdGggPSAxLzgsIGZpbGwgPSAiIzBGMkE0OCIsIGNvbG9yID0gImdyZXkiLCBhbHBoYSA9IDAuOSkgKwogIGdlb21fbGFiZWwoc3RhdCA9ICJzdHJhdHVtIiwgbGFiZWwuc3RyYXRhID0gVFJVRSkgKwogIGxhYnMoeD0iIix5PSIiKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lPU5VTEwpKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiSm9iIHRpdGxlIiwgIlN0YXRlIiksIGV4cGFuZCA9IGMoLjA1LCAuMDUpKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIikpKwogIHRoZW1lKGxpbmUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKCiMjIGJhciBwbG90OnN0ZW0gcHJvZ3JhbSBpbiBkaWZmZXJlbnQgam9iIHRpdGxlcwpgYGB7cn0KREFUQSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImJ1c2luZXNzIikmIChzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3QiKXxzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImludGVsbGlnZW5jZSIpKSAsICJidXNpbmVzcyBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmIChzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImVuZ2luZWVyIil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJ3YXJlaG91c2UiKSksICJkYXRhIGVuZ2luZWVyIiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAic2NpZW50aXN0IiksICJkYXRhIHNjaWVudGlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3R8YW5hbHl0aWNzIiksICJkYXRhIGFuYWx5c3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgIm1hY2hpbmV8ZGVlcCIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImxlYXJuaW5nIiksICJkZWVwIGxlYXJuaW5nICYgbWFjaGluZSBsZWFybmluZyIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAicHJvZHVjdCIpICYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGVuZ2luZWVyfGRhdGEiKSwgImRhdGEgcHJvZHVjdCBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSAKICBmaWx0ZXIoc3RlbSA9PSAxKSAlPiUgCiAgZ3JvdXBfYnkoam9iX3RpdGxlKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGFycmFuZ2UoLW4pICU+JSAKICBzbGljZSgxOjIwKSAlPiUgCiAgZ2diYXJwbG90KCJqb2JfdGl0bGUiLCAibiIsIGZpbGwgPSAiIzAwQjJFNCIsIGNvbG9yID0gIndoaXRlIiwgYWxwaGEgPSAwLjgsIHNvcnQudmFsID0gImFzYyIsIG9yaWVudGF0aW9uID0gImhvcml6IikgJT4lIAogIGxhYnModGl0bGUgPSAic3RlbSBwcm9ncmFtIikKYGBgCgojIE1BUCAtIGRhdGEgam9iIHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIGluIGVhY2ggY2l0eSAKYGBge3J9CmdncGxvdChwb2ludHMpICsgCiAgZ2VvbV9zZihkYXRhID0gc3RhdGVfbWFwcywgY29sb3IgPSAid2hpdGUiLCBmaWxsID0gImxpZ2h0Z3JleSIsYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGppdHRlcihsb24sMTAwKSwgeSA9IGppdHRlcihsYXQsMTAwKSwgY29sb3IgPSBtYXhfam9iLCBzaXplID0gbWF4KSwgYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiSm9iIFRpdGxlIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmJveCA9ICJob3Jpem9udGFsIiwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAsLTAuMSksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgICAgICAgKSsKICBsYWJzKHggPSAiIiwgeSA9ICIiLCB0aXRsZSA9ICIiLCBzaXplPSJOdW1iZXIiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QocG9pbnRzX2NhKSArIAogIGdlb21fc2YoZGF0YSA9IHN0YXRlX21hcHNfY2EsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uKSwgeSA9IGppdHRlcihsYXQpLCBjb2xvciA9IG1heF9qb2IsIHNpemUgPSBtYXgpLCBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJKb2IgVGl0bGUiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICAgICAgICkrCiAgbGFicyh4ID0gIiIsIHkgPSAiIiwgdGl0bGUgPSAiIiwgc2l6ZT0iTnVtYmVyIikKYGBgCgpgYGB7cn0KZ2dwbG90KHBvaW50c190eCkgKyAKICBnZW9tX3NmKGRhdGEgPSBzdGF0ZV9tYXBzX3R4LCBjb2xvciA9ICJ3aGl0ZSIsIGZpbGwgPSAibGlnaHRncmV5IixhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gaml0dGVyKGxvbiksIHkgPSBqaXR0ZXIobGF0KSwgY29sb3IgPSBtYXhfam9iLCBzaXplID0gbWF4KSwgYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiSm9iIFRpdGxlIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICAgICAgICApKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIsIHRpdGxlID0gIiIsIHNpemU9Ik51bWJlciIpCmBgYAoKYGBge3J9CmdncGxvdChwb2ludHNfbm9ydGhlYXN0KSArIAogIGdlb21fc2YoZGF0YSA9IHN0YXRlX21hcHNfbm9ydGhlYXN0LCBjb2xvciA9ICJ3aGl0ZSIsIGZpbGwgPSAibGlnaHRncmV5IixhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gaml0dGVyKGxvbiksIHkgPSBqaXR0ZXIobGF0KSwgY29sb3IgPSBtYXhfam9iLCBzaXplID0gbWF4KSwgYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiSm9iIFRpdGxlIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICAgICAgICApKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIsIHRpdGxlID0gIiIsIHNpemU9Ik51bWJlciIpCmBgYAoKYGBge3J9CmdncGxvdChwb2ludHNfbWlkd2VzdCkgKyAKICBnZW9tX3NmKGRhdGEgPSBzdGF0ZV9tYXBzX21pZHdlc3QsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uLDEwMCksIHkgPSBqaXR0ZXIobGF0LDEwMCksIGNvbG9yID0gbWF4X2pvYiwgc2l6ZSA9IG1heCksIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkpvYiBUaXRsZSIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgICAgICAgKSsKICBsYWJzKHggPSAiIiwgeSA9ICIiLCB0aXRsZSA9ICIiLCBzaXplPSJOdW1iZXIiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QocG9pbnRzX3RuKSArIAogIGdlb21fc2YoZGF0YSA9IHN0YXRlX21hcHNfdG4sIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uKSwgeSA9IGppdHRlcihsYXQpLCBjb2xvciA9IG1heF9qb2Isc2l6ZSA9IG1heCksIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkpvYiBUaXRsZSIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgICAgICAgKSsKICBsYWJzKHggPSAiIiwgeSA9ICIiLCB0aXRsZSA9ICIiLCBzaXplPSJOdW1iZXIiKQpgYGAKCmBgYHtyfQoKREFUQSAlPiUKICBmaWx0ZXIod29ya3NpdGVfc3RhdGVfYWJiPT0iVE4iKSAlPiUgCiAgZ3JvdXBfYnkoeWVhciwgZGF0YV9yZWxhdGlvbikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgIyBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZGF0YV9yZWxhdGlvbiwgdmFsdWVzX2Zyb20gPSBuKSAlPiUgCiAgIyBtdXRhdGUocmF0aW8gPSBkYXRhX3JlbGF0ZWQvKGRhdGFfcmVsYXRlZCArIHVuZGVmaW5lZCkpICU+JSAKICAjIGdncGxvdChhZXMoeSA9IHJhdGlvLCB4ID0geWVhcikpKwogICMgZ2VvbV9saW5lKCkrCiAgIyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMC4xNykpCiAgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4sIGZpbGwgPSBhcy5mYWN0b3IoZGF0YV9yZWxhdGlvbikpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwgYWxwaGEgPSAwLjgpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJEYXRhIGpvYnMiLCAiT3RoZXJzIikpICsKICBsYWJzKHk9IlxuIE51bWJlciIsIHg9IlxuIFllYXIiKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmdW5jdGlvbih4KXtwYXN0ZTAoeC8xMDAwLCAnSycpfSkgKyAKICB0aGVtZV9taW5pbWFsKCkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBg